﻿using System.Collections.Generic;
using MIAP.Entidades;

namespace MIAP.DataAccess.Interfaces
{
    /// <summary>
    ///  Interface de operaciones básicas en base de datos para la entidad de archivo
    /// </summary>
    public interface IArchivosDao
    {
        /// <summary>
        /// Obtiene todos los Archivos.
        /// </summary>
        /// <returns>Lista con todos los Archivos.</returns>
        IList<ArchivoInfo> GetArchivos();

        /// <summary>
        /// Obtiene todos los Archivos activos de un proyecto en especifico de un usuario en los que puede cargar información.
        /// </summary>
        /// <param name="idProyecto">Es el id del proyecto del cual queremos obtener los archivos relacionados.</param>
        /// <param name="idUsuario">Id del usuario a filtrar.</param>
        /// <returns>Lista con todos los Archivos.</returns>
        IList<ArchivoInfo> GetArchivosCarga(int idProyecto, int idUsuario);

        /// <summary>
        /// Obtiene todos los Archivos dependiendo del los filtros enviados, si no se requiere el filtro enviar NULL.
        /// </summary>
        /// <param name="nombreArchivo">Nombre delarchivo a buscar.</param>
        /// <param name="idProyecto">Es el id del proyecto del cual queremos obtener los archivos relacionados.</param>
        /// <param name="idFormatoArchivo">id del formato de archivo</param>
        /// <param name="esObligatorio">True si es obligatorio, false en caso contrario.</param>
        /// <param name="esVersion">true si es versión, false en caso contrario.</param>
        /// <param name="estaActivo">true si esta activo, false en caso contrario.</param>
        /// <returns>Lista con todos los Archivos.</returns>
        IList<ArchivoInfo> GetArchivos(string nombreArchivo, int? idProyecto, int? idFormatoArchivo, bool? esObligatorio, bool? esVersion, bool? estaActivo);

        /// <summary>
        /// Cambia el estatus del Archivo a activo o inactivo.
        /// </summary>
        /// <param name="idArchivo">Es el id del Archivo del cual se cambiará el estatus.</param>
        /// <param name="estatusRegistro">True (Activo), False (Inactivo).</param>
        void ChangeEstatusArchivo(int idArchivo, bool estatusRegistro);

        /// <summary>
        /// Obtiene la información de un determinado Archivo.
        /// </summary>
        /// <param name="idArchivo">Es el id del Archivo del que se desea obtener la información.</param>
        /// <returns>Información general del Archivo.</returns>
        ArchivoInfo GetArchivoById(int idArchivo);

        /// <summary>
        /// Agrega un nuevo Archivo.
        /// </summary>
        /// <param name="archivo">Es el proyecto que será agregado.</param>
        /// <param name="user">Usuario que esta agregando la información.</param>
        /// <param name="usuariosCarga">Usuarios que pueden cargar el archivo.</param>
        void AddNewArchivo(ArchivoInfo archivo, string user, List<UsuarioInfo> usuariosCarga = null);

        /// <summary>
        /// Modifica la información de un Archivo .
        /// </summary>
        /// <param name="archivo">Es el Archivo al que se le modificará la información.</param>
        /// <param name="user">Es el usuario que esta modificando la información.</param>
        /// <param name="usuariosCarga">Usuarios que pueden cargar el archivo.</param>
        void EditArchivo(ArchivoInfo archivo, string user, List<UsuarioInfo> usuariosCarga = null);

        /// <summary>
        /// Verifica la existencia de un archivo en un determinado proyecto.
        /// </summary>
        /// <param name="idProyecto">Es el id del proyecto con el que esta ligado el archivo.</param>
        /// <param name="nombreArchivo">Es el nombre del archivo.</param>
        /// <returns>Indicador de si el archivo existe o no y esta ligado al id del proyecto.</returns>
        bool VerifyExistNombreArchivoInProyecto(int idProyecto, string nombreArchivo);
    }
}
